﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Clinica_Frba.UserInterface.TDAs
{
    class Agenda_tda
    {
        /* El rango de horarios es un diccionario cuya clave principal es el día: "Lunes","Martes",etc.
         * Su valor es un vector de TimeSpan. Al momento de crearse será de longitud fija de 2 (hora desde y hora hasta)
         * */
        private Dictionary<string, TimeSpan[]> rangoHorarios;
        private List<DateTime[]> rangoFechas;

        public Agenda_tda(string rangoFechasSerializadas, string rangoHorariosSerializados)
        {
            deserializeHorarios(rangoHorariosSerializados);
            deserializeFechas(rangoFechasSerializadas);
        }

        public Agenda_tda()
        {
            this.rangoHorarios = new Dictionary<string, TimeSpan[]>();
            this.rangoFechas = new List<DateTime[]>();
        }

        private TimeSpan str_to_timespan(string hhmm)
        {
            hhmm = hhmm.Substring(0, 2) + ":" + hhmm.Substring(2, 2);
            TimeSpan span;
            TimeSpan.TryParse(hhmm, out span);
            return span;
        }
        private DateTime str_to_date(string ddmmaaaa)
        {
            ddmmaaaa = ddmmaaaa.Substring(0, 2) + "/" + ddmmaaaa.Substring(2, 2) + "/" + ddmmaaaa.Substring(4, 4);
            DateTime dt = new DateTime();
            if(DateTime.TryParse(ddmmaaaa,out dt))
                MessageBox.Show(dt.ToString());
            return dt;
        }

        private void deserializeHorarios(string horariosSerializados)        
        {
            this.rangoHorarios = new Dictionary<string, TimeSpan[]>();
            for(int i=0; i < 7 ; i++)
            {
                string horaDesde_str = horariosSerializados.Substring(i * 8, 4);                
                string horaHasta_str = horariosSerializados.Substring(i * 8 + 4, 4);
                if(horaDesde_str!="0000" && horaHasta_str!="0000")
                {
                    TimeSpan horaDesde_timespan = str_to_timespan(horaDesde_str);
                    TimeSpan horaHasta_timespan = str_to_timespan(horaHasta_str);

                    TimeSpan[] intervalo = new TimeSpan[2];
                    intervalo[0] = horaDesde_timespan;
                    intervalo[1] = horaHasta_timespan;
                    switch (i)
                    { 
                        case 0: // lunes
                            this.rangoHorarios["lunes"] = intervalo;
                            break;
                        case 1: // martes
                            this.rangoHorarios["martes"] = intervalo;
                            break;
                        case 2: // miercoles
                            this.rangoHorarios["miercoles"] = intervalo;
                            break;
                        case 3: // jueves
                            this.rangoHorarios["jueves"] = intervalo;
                            break;
                        case 4: // viernes
                            this.rangoHorarios["viernes"] = intervalo;
                            break;
                        case 5: // sabado
                            this.rangoHorarios["sabado"] = intervalo;
                            break;
                        case 6: // domingo
                            this.rangoHorarios["domingo"] = intervalo;
                            break;                    
                    }
                }
            }
            
        }

        private void deserializeFechas(string fechasSerializadas)
        {
            this.rangoFechas = new List<DateTime[]>();
            bool hayMasFechas = true;
            int tam = fechasSerializadas.Length;            
            int i = 0;
            //El tamaño tendría que ser múltiplo de 16 para que esté bien ya que cada dupla de fechas tiene ese tamaño
            if (tam % 16 != 0)
                Console.WriteLine("Cadena de fechas inválida");
            else
            {
                while (hayMasFechas)
                {
                    string fechaDesde = fechasSerializadas.Substring(i * 16, 8);
                    string fechaHasta = fechasSerializadas.Substring(i * 16 + 8, 8);
                    DateTime[] dt = new DateTime[2];
                    dt[0] = str_to_date(fechaDesde);
                    dt[1] = str_to_date(fechaHasta);
                    this.rangoFechas.Add(dt);
                    
                    i++;
                    hayMasFechas = (tam > i * 16);
                }
            }
        }

        public string serializeHorarios()
        {
            string resultado="";
            if (this.rangoHorarios.Keys.Contains("lunes"))
                resultado += rangoHorarios["lunes"][0].ToString().Replace(":", "").Substring(0, 4) + rangoHorarios["lunes"][1].ToString().Replace(":", "").Substring(0, 4);
            else resultado += "00000000";
            if (this.rangoHorarios.Keys.Contains("martes"))
                resultado += rangoHorarios["martes"][0].ToString().Replace(":", "").Substring(0, 4) + rangoHorarios["martes"][1].ToString().Replace(":", "").Substring(0, 4);
            else resultado += "00000000";
            if (this.rangoHorarios.Keys.Contains("miercoles"))
                resultado += rangoHorarios["miercoles"][0].ToString().Replace(":", "").Substring(0, 4) + rangoHorarios["miercoles"][1].ToString().Replace(":", "").Substring(0, 4);
            else resultado += "00000000";
            if (this.rangoHorarios.Keys.Contains("jueves"))
                resultado += rangoHorarios["jueves"][0].ToString().Replace(":", "").Substring(0, 4) + rangoHorarios["jueves"][1].ToString().Replace(":", "").Substring(0, 4);
            else resultado += "00000000";
            if (this.rangoHorarios.Keys.Contains("viernes"))
                resultado += rangoHorarios["viernes"][0].ToString().Replace(":", "").Substring(0, 4) + rangoHorarios["viernes"][1].ToString().Replace(":", "").Substring(0, 4);
            else resultado += "00000000";
            if (this.rangoHorarios.Keys.Contains("sabado"))
                resultado += rangoHorarios["sabado"][0].ToString().Replace(":", "").Substring(0, 4) + rangoHorarios["sabado"][1].ToString().Replace(":", "").Substring(0, 4);
            else resultado += "00000000";
            if (this.rangoHorarios.Keys.Contains("domingo"))
                resultado += rangoHorarios["sabado"][0].ToString().Replace(":", "").Substring(0, 4) + rangoHorarios["sabado"][1].ToString().Replace(":", "").Substring(0, 4);
            else resultado += "00000000";
            return resultado;
        }

        public string serializeFechas()
        {
            string resultado = "";
            foreach (DateTime[] fechasVec in rangoFechas)
                resultado += fechasVec[0].ToString().Substring(0, 10).Replace("/", "") + fechasVec[1].ToString().Substring(0, 10).Replace("/", "");
            return resultado;
        }

        public void mostrarDispoFechas()
        {
            string resultado="";
            foreach (DateTime[] dt in this.rangoFechas)
            {
                resultado += dt[0] + " - " + dt[1] + "\n";
            }
            MessageBox.Show(resultado);
        }

        public void mostrarDispoHorarios()
        {
            string resultado = "";
            resultado += "Lunes: " + this.rangoHorarios["lunes"][0].ToString() + " - " + this.rangoHorarios["lunes"][1].ToString()+"\n";
            resultado += "Martes: " + this.rangoHorarios["martes"][0].ToString() + " - " + this.rangoHorarios["martes"][1].ToString() + "\n";
            resultado += "Miercoles: " + this.rangoHorarios["miercoles"][0].ToString() + " - " + this.rangoHorarios["miercoles"][1].ToString() + "\n";
            resultado += "Jueves: " + this.rangoHorarios["jueves"][0].ToString() + " - " + this.rangoHorarios["jueves"][1].ToString() + "\n";
            resultado += "Viernes: " + this.rangoHorarios["viernes"][0].ToString() + " - " + this.rangoHorarios["viernes"][1].ToString() + "\n";
            resultado += "Sabado: " + this.rangoHorarios["sabado"][0].ToString() + " - " + this.rangoHorarios["sabado"][1].ToString() + "\n";
            
            MessageBox.Show(resultado);
        }
    }
}
